<?php
/** 
 * FileFind - ftp/shares indexing and search php engine,
 * http://project.ffind.ru
 *
 * Module: db_desc.php
 * Description: Additional metadata for database
 *
 * @package filefind
 * @copyright (c) 2003-2008 by Rage Steel, www.gt2.ru
 * @version $Id$
 */

chdir('../www');
require_once('./lib/lib.main.php');
$tpl['no_page_template'] = true;

// Добавление описаний колонок, объединений и функций отображения
// rel - отношения, в массиве:
//   'tbl' - имя таблицы, без префикса "tbl_", 'col' - название поля
// trans - трансформация браузера, без ".inc.php" в конце
// rem - комментарий колонки
$db_desc = array(
  'conn' => array(
    'host_id' => array(
      'rel' => array('tbl' => 'hosts', 'col' => 'host_id'),
      'rem' => 'Идентификатор узла'
    ),
    'conn_action' => array(
      'rem' => 'Запрошенное действие, 0: Ping, 2: Получение листинга'
    ),
    'conn_datetime' => array (
      'rem' => 'Дата/время соединения'
    ),
    'conn_dur' => array(
      'trans' => 'text_plain__seconds01',
      'rem' => 'Продолжительность соединения, сек/10'
    ),
    'conn_error' => array(
      'rem' => 'Результат операции - номер ошибки'
    )
  ),
  'crawl' => array(
    'host_id' => array(
      'rel' => array('tbl' => 'hosts', 'col' => 'host_id'),
      'rem' => 'Идентификатор узла'
    ),
    'crawl_dur' => array(
      'trans' => 'text_plain__seconds01',
    )
  ),
  'dirs' => array(
    'display_field' => 'dir_name',
    'host_id' => array(
      'rel' => array('tbl' => 'hosts', 'col' => 'host_id'),
      'rem' => 'Идентификатор узла'
    ),
    'par_dir_id' => array(
      'rel' => array('tbl' => 'dirs', 'col' => 'dir_id')
    ),
    'owner_id' => array(
      'rel' => array('tbl' => 'owners', 'col' => 'owner_id')
    ) 
  ),
  'fhash' => array(
    'file_id' => array(
      'rel' => array('tbl' => 'files', 'col' => 'file_id')
    )
  ),
  'files' => array(
    'display_field' => 'file_name',
    'dir_id' => array(
      'rel' => array('tbl' => 'dirs', 'col' => 'dir_id')
    ),
    'host_id' => array(
      'rel' => array('tbl' => 'hosts', 'col' => 'host_id'),
      'rem' => 'Идентификатор узла'
    ),
    'owner_id' => array(
      'rel' => array('tbl' => 'owners', 'col' => 'owner_id')
    ) 
  ),
  'hact' => array(
    'host_id' => array(
      'rel' => array('tbl' => 'hosts', 'col' => 'host_id'),
      'rem' => 'Идентификатор узла'
    )
  ),
  'hosts' => array(
    'display_field' => 'host_name',
    'host_ip' => array(
      'trans' => 'text_plain__ntoa'
    )
  ),
  'preq' => array(
    'req_ip' => array(
      'trans' => 'text_plain__ntoa'
    ),
    'req_pgt' => array(
      'trans' => 'text_plain__seconds01'
    ),
    'req_sqt' => array(
      'trans' => 'text_plain__seconds01'
    )
  ),
  'query' => array(
    'display_field' => 'query_str',
    'query_id' => array(
      'rem' => 'Идентификатор поискового запроса'
    ),
    'user_ip' => array(
      'trans' => 'text_plain__ntoa'
    )
  ),
  'res' => array(
    'query_id' => array(
      'rel' => array('tbl' => 'query', 'col' => 'query_id'),
      'rem' => 'Идентификатор поискового запроса'
    )
  ),
  'wres' => array(
    'query_id' => array(
      'rel' => array('tbl' => 'query', 'col' => 'query_id'),
      'rem' => 'Идентификатор поискового запроса'
    ),
    'weight_val' => array(
      'rem' => '"Вес" результата, если запрос с релевантностью, иначе - 0'
    ),
    'res_id' => array(
      'rem' => 'Идентификатор результата'
    ),
    'res_flags' => array(
      'rem' => 'Тип результата, 1 - каталог, 0 - файл'
    )
  )
);

$sqlconn = CreateSQLConn('localhost', 'root', '', 'phpmyadmin');
$cfg['pma_rel'] = 'pma_relation';
$cfg['pma_col'] = 'pma_column_info';
$cfg['pma_tbl'] = 'pma_table_info';

reset($db_desc);
while(list($table, $tdata) = each($db_desc)) {
  $table_name = $cfg['tbl_' . $table];

  reset($tdata);
  while(list($column, $cdata) = each($tdata)) {
    if ($column == 'display_field') {
      $mode = 0;
      while(true) {
        $dq = new CSqlQ('pma_tbl');
        $dq->add_value('db_name', $cfg['db_database']);
        $dq->add_value('table_name', $table_name);
        
        if (0 == $mode) {
          $dq->fill_where(true);
          $dq->add_field('display_field');
          $dq->exec_select();
          if ($dq->num_rows() > 0) {
            list($df) = $dq->fetch_row();
            if ($df != $cdata) {
              $mode = 2;
            } else {
              break;
            }
          } else {
            $mode = 1;
          }
        } elseif((1 == $mode) || (2 == $mode)) {
          if (2 == $mode) {
            $dq->fill_where(true);
          }
          $dq->add_value('display_field', $cdata);
          if (1 == $mode) {
            $dq->exec_insert();
          } elseif (2 == $mode) {
            $dq->exec_update();
          }
          break;
        }
      }
      continue;
    }

    // Информация по колонкам
    if (isset($cdata['rem']) || isset($cdata['trans'])) {
      $mode = 0;
      // 0 - проверка существования
      // 1 - добавление новго
      // 2 - обновление существующего
      while(true) {
        $cq = new CSqlQ('pma_col');
        $cq->add_value('db_name', $cfg['db_database']);
        $cq->add_value('table_name', $table_name);
        $cq->add_value('column_name', $column);

        if (0 == $mode) {
          $cq->fill_where(true);
          $cq->add_field('id');
          $cq->exec_select();

          if ($cq->num_rows() > 0) {
            $mode = 2;
            list($id) = $cq->fetch_row();
            continue;
          } else {
            $mode = 1;
          }
        } elseif ((1 == $mode) || (2 == $mode)) {
          if (isset($cdata['rem'])) {
            $cq->add_value('comment', $cdata['rem']);
          }
          if (isset($cdata['trans'])) {
            $cq->add_value('transformation', $cdata['trans'] . '.inc.php');
          }
          if (1 == $mode) {
            $cq->exec_insert();
          } elseif (2 == $mode) {
            $cq->where = "id = $id";
            $cq->exec_update();
          }
          break;
        }
      }
    }

    // Информация по отношениям
    if (isset($cdata['rel'])) {
      $mode = 0;
      while(true) {
        $rq = new CSqlQ('pma_rel');
        $rq->add_value('master_db', $cfg['db_database']);
        $rq->add_value('master_table', $table_name);
        $rq->add_value('master_field', $column);

        if (0 == $mode) {
          $rq->fill_where(true);
          $rq->add_calc_field('cnt', 'COUNT(*)');
          $rq->exec_select();

          list($cnt) = $rq->fetch_row();

          if ($cnt > 0) {
            $mode = 2;
          } else {
            $mode = 1;
          }
        } elseif ((1 == $mode) || (2 == $mode)) {
          if (2 == $mode) {
            $rq->fill_where(true);
          }
          $rel = $cdata['rel'];
          $rq->add_value('foreign_db', $cfg['db_database']);
          $rq->add_value('foreign_table', $cfg['tbl_' . $rel['tbl']]);
          $rq->add_value('foreign_field', $rel['col']);

          if (1 == $mode) {
            $rq->exec_insert();
          } elseif (2 == $mode) {
            $rq->exec_update();
          }
          break;
        }
      }
    }
  }
}

?>